/*
	纯需函数与抽象类:
		纯需函数：
			基类中没有定义，只有: virtual typefunc_name(参数类表) = 0;
		   但是在子类(派生类)中，必须有定义

		抽象类:
			至少有一个纯需函数的类，称为抽象类;

	注意:
		在构造函数和析构函数中调用的函数时，采用静态联编；所以构造和析够函数不能调用纯需函数，但其他成员函数可以调用纯需函数;

		抽象类(含纯需函数)不能构造对象;不能用作参数返回类型、函数放回类型或显示转换的类型;
	  但可以声明抽象类的指针和应用;
*/

#include <iostream>
using namespace std;

class point {...};

class shape {
	point center; // 对象成员, 表示中心点

	public:
		point where() { return center; }
		void move(point p) {
			center = p;
			draw();	// 除构造、析构外，其他成员函数可以调用纯需函数
		}
		virtual void ratate( int ) = 0;	// 纯需函数
		virtual void draw() = 0; // 纯需函数
};

class ab_circle : public shape {
	int radius;
	
	public:
		void ratate(int) {
			....
		}
}; // @ 此时ab_circle::draw()也是一个纯需函数，所以ab_circle仍是一个抽象类

class ab_circle : public shape {
	int radius;
	public:
		void rotate(int ) {
			...
		}
		void draw() {
			...
		}
}; // 此时ab_circle为非抽象类，

int main(int argc, char * argv[]) {
	shape x; 	// Error: 抽象类不能创建对象;
	shape * p;  // 可以声明抽象类的指针和引用
	shape f();	// Error: 抽象类不能用作函数的返回类型
	void g(shape);	// Error: 抽象类不能用作函数的参数类型
	shape & h(shape & );	// 可以声明抽象类的引用

	return 0;
}
